package NowCoder.JavaSE.String;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;

/**
 * HJ71 字符串通配符
 * 中等  通过率：24.34%  时间限制：1秒  空间限制：32M
 * 知识点 字符串
 * warning 校招时部分企业笔试将禁止编程题跳出页面，为提前适应，练习时请使用在线自测，而非本地IDE。
 * 描述
 * 问题描述：在计算机中，通配符一种特殊语法，广泛应用于文件搜索、数据库、正则表达式等领域。现要求各位实现字符串通配符的算法。
 * 要求：
 * 实现如下2个通配符：
 * *：匹配0个或以上的字符（注：能被*和?匹配的字符仅由英文字母和数字0到9组成，下同）
 * ？：匹配1个字符
 *
 * 注意：匹配时不区分大小写。
 *
 * 输入：
 * 通配符表达式；
 * 一组字符串。
 * 输出：
 *
 * 返回不区分大小写的匹配结果，匹配成功输出true，匹配失败输出false
 * 数据范围：字符串长度：  1≤s≤100
 * 进阶：时间复杂度： O( n^2 ) ，空间复杂度： O(n)
 *
 * 输入描述：
 * 先输入一个带有通配符的字符串，再输入一个需要匹配的字符串
 *
 * 输出描述：
 * 返回不区分大小写的匹配结果，匹配成功输出true，匹配失败输出false
 *
 * 示例1          示例2     示例3
 * 输入：         输入：     输入：
 * te?t*.*       z         pq
 * txt12.xls     zz        pppq
 * 输出：         输出：     输出：
 * false        false      false
 *
 * 示例4          示例5      示例6
 * 输入：         输入：      输入：
 * **Z           ?*Bc*?    p*p*qp**pq*p**p***ppq
 * 0QZz          abcd      pppppppqppqqppqppppqqqppqppqpqqqppqpqpppqpppqpqqqpqqp
 * 输出：         输出：     输出：
 * true          true      false
 *
 * 示例7
 * 输入：
 * h*?*a
 * h#a
 * 输出：
 * false
 * 说明：
 * 根据题目描述可知能被*和?匹配的字符仅由英文字母和数字0到9组成，所以?不能匹配#，故输出false
 *
 * https://www.nowcoder.com/practice/43072d50a6eb44d2a6c816a283b02036?tpId=37&tqId=21294&ru=/exam/oj
 */
public class 字符串通配符_HJ71 {
    //TODO:请重新做这一道题
    //题解一 动态规划
    public static void main1(String[] args) throws IOException {
        BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
        String s=null;
        while((s=br.readLine())!=null){
            String ss=br.readLine();

            s=s.toLowerCase();
            ss=ss.toLowerCase();
            char sss[]=ss.toCharArray();
            char ppp[]=s.toCharArray();

            boolean dp[][]=new boolean[ppp.length+1][sss.length+1];
            dp[0][0]=true;
            for(int i=1;i<=ppp.length;i++){
                if(ppp[i-1]=='*'){
                    dp[i][0]=true;
                }else break;

            }
            for(int i=1;i<=ppp.length;i++){
                for(int j=1;j<=sss.length;j++){
                    if(ppp[i-1]==sss[j-1]){
                        dp[i][j]=dp[i-1][j-1];
                    }
                    if(ppp[i-1]=='?'&&((sss[j-1]>='a'&&sss[j-1]<='z')||(sss[j-1]>='0'&&sss[j-1]<='9'))){
                        dp[i][j]=dp[i-1][j-1];
                    }else if(ppp[i-1]=='*'&&((sss[j-1]>='a'&&sss[j-1]<='z')||(sss[j-1]>='0'&&sss[j-1]<='9'))){
                        dp[i][j]=dp[i-1][j]|dp[i][j-1]|dp[i-1][j-1];
                    }
                    //System.out.print(dp[i][j]+"  ");
                }
                //System.out.print("\n");
            }
            System.out.println(dp[ppp.length][sss.length]);
        }
    }
    //题解二
    public static void main(String[] args) throws IOException {
        BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
        String value;
        while ((value = bf.readLine()) != null) {
            String target = bf.readLine();
            value = value.toLowerCase(Locale.ROOT);
            target = target.toLowerCase(Locale.ROOT);
            String regx = value.replaceAll("\\*{2,}","\\*");
            regx = regx.replaceAll("\\?","[0-9a-z]{1}");
            regx = regx.replaceAll("\\*","[0-9a-z]{0,}");
            System.out.println(target.matches(regx));
        }
    }

}
